<?php
    # Autoload hakee luokkia class - kansiosta    
    spl_autoload_register(function($class) {
        $classPrefix    = "class";
        $subfolder      = "";
        $fileExt        = ".php";
        $filename       = dirname(__DIR__).
            DIRECTORY_SEPARATOR.
            "class".
            DIRECTORY_SEPARATOR;

        if (mb_substr($class,0,10) == "SharedPHP\\") {
            $class = mb_substr($class,10);
            $filename = dirname(__DIR__).
                DIRECTORY_SEPARATOR.
                "3party".
                DIRECTORY_SEPARATOR.
                "PHP".
                DIRECTORY_SEPARATOR.
                "SharedPHP-0.10.003".
                DIRECTORY_SEPARATOR;

            switch ($class) {                
                case "FormTools":
                    $subfolder = "formTools";
                    break;
                
                default:
                    $filename = null;
            }
            
            $subfolder .= DIRECTORY_SEPARATOR;
        }
        
        if ($filename) {
            $filename .= $subfolder.$classPrefix.$class.$fileExt;
            if (file_exists($filename)) { # Luokka löytyy
                require($filename);
            }
        }
    });
    
    # Muodosta aliakset
    class_alias("SharedPHP\FormTools","FT");
    
    # Aseta aikavyöhyke
    date_default_timezone_set(config("UI","timezone"));
    
    # Session asetukset
    ini_set("session.cookie_httponly",          1);
    ini_set("session.hash_function",            "sha512");
    ini_set("session.hash_bits_per_character",  5);
    ini_set("session.name",                     config("session","name"));
    ini_set("session.use_only_cookies",         1);
    if (isset($_SERVER["HTTPS"])) {
        ini_set("session.cookie_secure", 1);
    }
    
    # Session käsittelijä
    session_set_save_handler(new AppSessionHandler(),true);
    
    # Käynnistä sessio
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
        
    /**
     * Funktio tutkii onko taulukossa haluttua saraketta ja palauttaa sen.
     *
     * Jos saraketta ei löydy palautetaan oletusarvo.
     *
     * @param   array   $arr        Taulukko
     * @param   mixed   $key        Sarakkeen nimi
     * @param   mixed   $default    Oletus (vapaaehtoinen, oletusarvo NULL)
     * @return  mixed
     */
    function arrGet($arr,$key,$default = null) {
        $result = $default;
        if (is_array($arr) && array_key_exists($key,$arr)) {
            $result = $arr[$key];
        }
        return $result;
    }
    
    /**
     * Lukee asetuksen konfiguraatiotiedostosta.
     *
     * @param   string  $section    Asetuksen lohko
     * @param   string  $name       Asetuksen nimi
     * @param   mixed   $default    Oletus jos asetusta ei löydy (oletusarvo NULL)
     * @return  mixed
     */
    function config($section,$name,$default = null) {
        static $data = array();
        
        # Hae data
        if (empty($data)) {
            $data = parse_ini_file(
                dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR.".config",
                true
            );
              
            if (!$data) {
                $data = array();
            }
        }
        
        $result = $default;
        
        # Löytyykö asetus
        if (!empty($data) && array_key_exists($section,$data)) {
            if (is_array($data[$section]) && array_key_exists($name,$data[$section])) {
                $result = trim($data[$section][$name]);
            }
        }
        
        return $result;
    }
    
    /**
     * Funktio luo pagination elementin parametrien avulla.
     *
     * @param   string  $class      Linkkielementtiin tuleva luokkamääre
     * @param   int     $pos        Nykyinen positio
     * @param   int     $count      Tuloksia per sivu
     * @param   int     $totalCount Tuloksia yhteensä
     * @return  string
     */
    function createPagination($class,$pos,$count,$totalCount) {                
        $pages  = (($count > 0) ? ceil($totalCount/$count) : 0);
        $posArr = array();
        
        $first = $prev = $next = $last = 0;
        
        # Jos sivuja löytyy niin päätellään navigoinnin positiot
        if ($pages > 0) {
            $next = $last = $pages*$count-$count;
            
            # Edellinen positio
            if ($pos > 0) {
                $p = $prev = $pos-$count;
                
                # Neljä edellistä positiota
                $x = 0;
                while ($p >= 0 && $x < 4) {
                    $posArr[$p] = $p/$count+1;
                    $p -= $count;
                    $x++;
                }
            }
            
            # Nykyinen positio
            $posArr[$pos] = $pos/$count+1;
            
            # Seuraava positio
            if ($pos < $last) {
                $p = $next = $pos+$count;
                
                # Neljä seuraavaa positiota
                $x = 0;
                while ($p <= $last && $x < 4) {
                    if (count($posArr) == 5) {
                        array_shift($posArr);
                        $x++;
                    }
                    
                    $posArr[$p] = $p/$count+1;
                    $p += $count;
                    $x++;
                }
            }
            
            ksort($posArr);
        }
        
        $class = htmlescape($class);
        
        # Onko kyseessä ensimmäinen sivu
        $aClass = " class=\"$class\"";
        $liClass = "";
        if ($pos == 0) {
            $aClass = "";
            $liClass = " class=\"disabled\"";
        }
        
        $html = <<<HTML
            <nav>
                <ul class="pagination">
                    <li$liClass>
                        <a$aClass data-pos="$first" href="#">
                            <span aria-hidden="true">&laquo;&laquo;</span>
                            <span class="sr-only">First</span>
                        </a>
                    </li>
                    <li$liClass>
                        <a$aClass data-pos="$prev" href="#">
                            <span aria-hidden="true">&laquo;</span>
                            <span class="sr-only">Previous</span>
                        </a>
                    </li>
HTML;
        
        foreach ($posArr as $ppos => $page) {                        
            # Onko kyseessä aktiivinen sivu
            $aClass = " class=\"$class\"";
            $liClass = "";
            if ($ppos == $pos) {
                $aClass = "";
                $liClass = " class=\"active\"";
            }
            
            $html .= <<<HTML
                    <li$liClass>
                        <a$aClass data-pos="$ppos" href="#">
                            $page
                        </a>
                    </li>
HTML;
        }
        
        # Onko kyseessä viimeinen sivu
        $aClass = " class=\"$class\"";
        $liClass = "";        
        if ($pos == $last) {
            $aClass = "";
            $liClass = " class=\"disabled\"";            
        }
        
        $html .= <<<HTML
                    <li$liClass>
                        <a$aClass data-pos="$next" href="#">
                            <span aria-hidden="true">&raquo;</span>
                            <span class="sr-only">Next</span>
                        </a>
                    </li>
                    <li$liClass>
                        <a$aClass data-pos="$last" href="#">
                            <span aria-hidden="true">&raquo;&raquo;</span>
                            <span class="sr-only">Last</span>
                        </a>
                    </li>
                </ul>
            </nav>
HTML;
        
        return $html;
    }
    
    /**
     * Funktio palauttaa levytankotyypin kuvauksen.
     *
     * @param   string  $val    Levytankotyypin nimi    
     * @return  string
     */
    function getBarbellTypeDesc($val) {
        $result = "";
        
        $arr = array(
            "buffalo_bar"   => "Buffalo bar",
            "cambered_bar"  => "Cambered bar",
            "curl_bar"      => "Curl bar",
            "olympic_bar"   => "Olympic bar",
            "safety_bar"    => "Safety bar",
            "standard_bar"  => "Standard bar",
            "swiss_bar"     => "Swiss bar",
            "thick_bar"     => "Thick bar",
            "trap_bar"      => "Trap bar"
        );
        if ($val && isset($arr[$val])) {
            $result = $arr[$val];
        }
        
        return $result;
    }
    
    /**
     * Hakee harjoitteen kuvauksen.
     *
     * @param   int $exerciseid Harjoitteen id
     * @return  string
     */
    function getExerciseText($exerciseid) {
        static $cache = array();
        $result = "";
        
        if (empty($cache)) {
            $cache = API::exerciseGetList();
        }
        
        foreach ((array)$cache as $category => $musclegroups) {
            foreach ($musclegroups as $musclegroup => $exercises) {
                foreach ($exercises as $id => $text) {
                    if ($id == $exerciseid) {
                        $result = $text;
                        break;
                    }
                }
            }
        }
        
        return $result;
    }
    
    /**
     * Palauttaa taulukon varusteiden kuvauksista.
     *
     * @return  array
     */
    function getGearDesc() {
        return array(
            "gear_belt"         => "Belt",
            "gear_knee_wraps"   => "Knee wraps",
            "gear_shirt"        => "Shirt",
            "gear_suit"         => "Suit",
            "gear_wrist_straps" => "Wrist straps",
            "gear_wrist_wraps"  => "Wrist wraps"
        );
    }
    
    /**
     * Funktio palauttaa toistotyypin kuvauksen.
     *
     * @param   string  $val    Toistontyypin nimi    
     * @return  string
     */
    function getRepetitionsTypeDesc($val) {
        $result = "";
        
        $arr = getRepetitionsTypeArr();
        if ($val && isset($arr[$val])) {
            $result = $arr[$val];
        }
        
        return $result;
    }
    
    /**
     * Funktio palauttaa taulukon joka sisältää toistotyyppien kuvaukset
     *
     * @return  array
     */
    function getRepetitionsTypeArr() {
        return array(
            "forced"        => "Forced",
            "max_attempt"   => "Max attempt",
            "negative"      => "Negative",
            "normal"        => "Normal",
            "partial"       => "Partial"
        );
    }
    
    /**
     * Funktio palauttaa painon mittausajan kuvauksen
     *
     * @param   string  $val    Mittausajan nimi
     * @return  string
     */
    function getMeasurementTimeDesc($val) {
        $result = "";
        
        $arr = array(
            "evening"   => "Evening",
            "morning"   => "Morning"
        );
        if ($val && isset($arr[$val])) {
            $result = $arr[$val];
        }
        
        return $result;
    }
    
    /**
     * Funktio palauttaa harjoitteen erikoistekniikan kuvauksen.
     *
     * @param   string  $val    Erikoistekniikan nimi
     * @return  string
     */
    function getSpecialExerciseDesc($val) {
        $result = "";
        
        $arr = array(
            "dropset"       => "Dropset",
            "giantset"      => "Giant set",
            "rest_pause"    => "Rest-Pause",
            "pair"          => "Exercise pair",
            "superset"      => "Superset",
            "triplseset"    => "Tripleset"
        );
        if ($val && isset($arr[$val])) {
            $result = $arr[$val];
        }
        
        return $result;
    }
    
    /**
     * Ajaa merkkijonon htmlspecialchars funktion läpi.
     *
     * @param   string  $value  Merkkijono
     * @return  string
     */
    function htmlescape($value) {
        if (!is_string($value) && !is_numeric($value)) {
            $value = "";
        }
        
        return htmlspecialchars($value,(ENT_COMPAT | ENT_HTML401),"utf-8",true);
    }
        
    /**
     * Funktio muuttaa sekunnit merkkijonoksi (esim. 1min 20sec)
     *
     * @param   int $sec    Aika sekuntteina
     * @return  string
     */
    function secToStr($sec) {
        $result = "Not selected";
        
        if (isset($sec)) {
            $sec = (int)$sec;
            
            if ($sec < 60) {
                $result = "$sec sec";
            } else {
                $min = floor($sec/60);
                $mod = $sec%60;
                
                $result = "$min min";
                if ($mod > 0) {
                    $result .= " $mod sec";
                }
            }
        }
        
        return $result;
    }